package com.AdvancedDemos.单元测试_反射_注解.反射;

/*

 * 反射技术，指的是加载类的字节码到内存，并以编程的方法解刨出类中的各个成分（成员变量、方法、构造器等）
 *
 * 在程序运行过程中动态获取类的组成部分，并动态使用的过程。其根本原则是类的解耦设计及动态操作
 *
 * 什么叫代码源文件？ .java
 * 什么叫字节码文件？ .class
 * 什么叫字节码文件对象？ java虚拟机一启动就会为每个内存中的字节码文件创建一个字节码文件对象
 * 什么叫Class类？ 类类型(就是字节码文件对象的类型)
 * Class类的对象是什么？  字节码文件对象，它描述了一个类
 */


public class _1_获取字节码文件对象 {
    public static void main(String[] args) throws ClassNotFoundException {

        /**
         * 获取Person类的字节码文件对象
         */

        //方式1:类名.class
        Class clazz = Person.class;//clazz是Person类的字节码文件对象,其类型Class是类类型
        System.out.println(clazz);//class com.AdvancedDemos.单元测试_反射_注解_代理.反射.Person

        //方式2 (使用最多) :public static Class forName(String package)
        Class clazz2 = Class.forName("com.AdvancedDemos.单元测试_反射_注解.反射.Person");//com.AdvancedDemos.单元测试_反射_注解_代理.反射.Person类全限定名
        System.out.println(clazz2);//class com.AdvancedDemos.单元测试_反射_注解_代理.反射.Person

        System.out.println(clazz == clazz2);//true 内存中字节码文件对象只有一个,是虚拟机自己创建的

        //方式3:Object提供的方法: public Class getClass()
        Person p = new Person();
        Class clazz3 = p.getClass();
        System.out.println(clazz3);//class com.AdvancedDemos.单元测试_反射_注解_代理.反射.Person

        System.out.println(clazz == clazz2 && clazz == clazz3);//true 内存中字节码文件对象只有一个,是虚拟机自己创建的


    }
}

